package com.jt;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableFeignClients
/**
 * 当使用@EnableFeignClients注解描述配置类时，主要用于
 * 告诉spring框架，要对使用@FeignClients注解描述
 * 的接口创建其实现类以及对象
 */
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

    /**
     * 构建对象时，基于此对象实现远程服务的调用
     * 因为spring容器初始化时，没有创建这个对象，所以我们自己创建
     * 然后交给spring容器去处理
     *
     * @return
     * 在spring中配置第三方的Bean时，可以通过@BEan的方式
     * 对指定方法进行描述，然后在方法内部进行对象的创建和配置
     *
     *
     *
     */
    @Bean
    //@ConditionalOnMissingBean//Spring 容器中没有这个bean时才生效
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    /**
     * 使用注解@LoadBalanced描述RestTemplate对象时
     * 假如使用RestTemplate对象发起远程服务调用。底层会对这个
     * 请求进行拦截，拦截到此请求后，会基于LoadBalancerClient对象获取服务实例，然后进行负载均衡方式的调用
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate lod(){
        return new RestTemplate();
    }
}
